package controller;

import AStar.AStar;
import AStar.Grid;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Node;
import view.Janela;

/**
 *
 * @author Raphael Pereira de Faria
 * @author Carlos Henrique Silva Galdino
 *
 */
public class Controle {

    private Grid grid;
    private AStar astar;
    private ArrayList<Point> caminho;
    private Janela jan;
    private int custo;

    public Controle() {
        int largura = 45;
        int altura = 45;
        grid = new Grid(altura, largura);
        astar = new AStar(grid);
        caminho = new ArrayList<Point>();
        jan = new Janela("Aplicativo", this);
    }

    /**
     * Método que efetua a chamada da busca de caminho ao agente
     * @param grid - grid contendo a disposição dos pontos
     */
    public void procurarCaminho() {
        caminho.clear();
        Node n = astar.pathFind(getGrid());
        custo = 0;

        try {
            while (!n.equals(grid.getNohInicial())) {
                caminho.add(n.getCoord());
                custo += n.getPeso();
                n = n.getPai();
            }
        } catch (NullPointerException exc) {
            JOptionPane.showMessageDialog(null, "Não existe um caminho possível", "Informação", JOptionPane.ERROR_MESSAGE);
        }
    }

    public Grid getGrid() {
        return grid;
    }

    public AStar getAstar() {
        return astar;
    }

    public void setPontoInicial(Point p) {
        grid.setNohInicial(new Node(p, 1));
    }

    public void setAstar(AStar astar) {
        this.astar = astar;
    }

    public ArrayList<Point> getCaminho() {
        return caminho;
    }

    public int getCusto() {
        return custo;
    }

    /**
     * Método que remove um ponto do caminho encontrado
     * @param x - valor da coordenada no eixo x
     * @param y - valor da coordenada no eixo y
     */
    public void removePontoCaminho(int x, int y) {
        if (!caminho.isEmpty()) {
            Point r = null;
            for (Point p : caminho) {
                if (p.equals(new Point(x, y))) {
                    r = p;
                }
            }
            if (r != null) {
                caminho.remove(r);
            }
        }
    }

}
